from py.DBUtil import Engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, INT, FLOAT


def Book_class(base=declarative_base()):
    class Book(base):
        __tablename__ = "booktable"

        __table_args__ = {'extend_existing': True}

        ISBN = Column(String(30), primary_key=True, nullable=False)

        name = Column(String(30), nullable=False)

        press = Column(String(30))

        editor = Column(String(50))

        category = Column(String(99))

        attr1 = Column(String(10), nullable=False)

        attr2 = Column(String(10))

        attr3 = Column(String(10))

        attr4 = Column(String(10))

        amount = Column(INT, nullable=False)

        left = Column(INT, nullable=False)

        price = Column(FLOAT, nullable=True)

        count = Column(INT, nullable=False, default=0)
        session = Engine.DBSession()

        def __getitem__(self, item):
            '''内置方法, 当使用obj['name']的形式的时候, 将调用这个方法, 这里返回的结果就是值'''
            return getattr(self, item)

        def keys(self):
            '''当对实例化对象使用dict(obj)的时候, 会调用这个方法,这里定义了字典的键, 其对应的值将以obj['name']的形式取,
            但是对象是不可以以这种方式取值的, 为了支持这种取值, 可以为类增加一个方法'''
            return 'ISBN', 'name', 'press', 'editor', 'category', 'attr1', 'attr2', 'attr3', 'attr4', 'amount', 'left', 'price'

    return Book
